package Negocios;

import Gestores.DtoObjects.AfiliadoDTO;
import Gestores.Entidades.EntidadAfiliado;
import Gestores.Factory.FactoryClass;
import java.sql.Date;
import java.util.ArrayList;
import javax.swing.table.DefaultTableModel;

public class AfiliadoNegocio {

    private AfiliadoDTO gestorAfiliado;

    public AfiliadoNegocio() {
        gestorAfiliado = FactoryClass.getAfiliadoInstance();
    }

    public ArrayList<Object> buscarPorId(String idAfiliado) throws Exception {
        if (true) {
            return gestorAfiliado.buscarPorId(idAfiliado);
        } else {
            throw new Exception("El formato del Id del Afiliado no es Correcto.\n Formato: LNNNN\nL=Letra\nN=Numero");
        }
    }

    public ArrayList<Object> buscarPorCi(int ciAfiliado) throws Exception {
        if (ciAfiliado < 0) {
            throw new Exception("El formato del C.I. del Afiliado no es Correcto.\n Formato: Numero Entero Positivo ");
        } else {
            return gestorAfiliado.buscarPorCi(ciAfiliado);
        }
    }

    public ArrayList<Object> buscarPorNombres(String nombresAfiliado) throws Exception {
        if ((nombresAfiliado == null) || (nombresAfiliado.equals(""))) {
            throw new Exception("El formato del Nombre del Afiliado no es Correcto.\n Formato: Texto");
        } else {
            return gestorAfiliado.buscarPorNombres(nombresAfiliado);
        }
    }

    public ArrayList<Object> buscarPorApellidoPaterno(String apellidoPaternoAfiliado) throws Exception {
        if ((apellidoPaternoAfiliado == null) || (apellidoPaternoAfiliado.equals(""))) {
            throw new Exception("El formato del Apellido Paterno del Afiliado no es Correcto.\n Formato: Texto");
        } else {
            return gestorAfiliado.buscarPorApellidoPaterno(apellidoPaternoAfiliado);
        }
    }

    public ArrayList<Object> buscarPorApellidoMaterno(String apellidoMaternoAfiliado) throws Exception {
        if ((apellidoMaternoAfiliado == null) || (apellidoMaternoAfiliado.equals(""))) {
            throw new Exception("El formato del Apellido Materno del Afiliado no es Correcto.\n Formato: Texto");
        } else {
            return gestorAfiliado.buscarPorApellidoMaterno(apellidoMaternoAfiliado);
        }
    }

    public ArrayList<Object> buscarPorEstadoCivil(String estadoCivilAfiliado) throws Exception {
        if ((estadoCivilAfiliado == null) || (estadoCivilAfiliado.equals(""))) {
            throw new Exception("El formato del Estasdo Civil del Afiliado no es Correcto.\n Formato: una letra");
        } else {
            return gestorAfiliado.buscarPorEstadoCivil(estadoCivilAfiliado.charAt(0));
        }
    }

    public ArrayList<Object> buscarPorFechaInscripcion(Date fechaInscripcionAfiliado) throws Exception {
        if (fechaInscripcionAfiliado == null) {
            throw new Exception("El formato de la fecha de la Inscripcion no es Correcto.\n Formato: Anho/Mes/Dia");
        } else {
            return gestorAfiliado.buscarPorFechaInscripcion(fechaInscripcionAfiliado);
        }
    }

    public ArrayList<Object> buscarPorActivos() throws Exception {
        return gestorAfiliado.buscarPorActivos();
    }

    public ArrayList<Object> buscarPorNoActivos() throws Exception {
        return gestorAfiliado.buscarPorNoActivos();
    }

    public boolean existe(String id) throws Exception {
        if (id == null) {
            throw new Exception("El ID no es válido.");
        } else {
            return gestorAfiliado.existe(id);
        }
    }

    public void habilitarAfiliado(String id) throws Exception {
        gestorAfiliado.habilitarAfiliado(id);
    }

    public void deshabilitarAfiliado(String id) throws Exception {
        gestorAfiliado.deshabilitarAfiliado(id);
    }

    public ArrayList<Object> mostrarDatos() throws Exception {
        return gestorAfiliado.listarTabla();
    }

    public DefaultTableModel tabularDatos(ArrayList<Object> listaDatos) {
        String[] campos = new String[]{"Id", "C.I.", "Nombres", "Apellido Paterno",
            "Apellido Materno", "Direccion", "Estado Civil", "Fecha de Incripcion", "Activo"};
        DefaultTableModel model = new DefaultTableModel(campos, 0);

        for (int i = 0; i < listaDatos.size(); i++) {
            EntidadAfiliado eAfiliado = (EntidadAfiliado) listaDatos.get(i);
            Object[] camposAfiliado = new Object[]{eAfiliado.getId(),
                eAfiliado.getCi(), eAfiliado.getNombres(), eAfiliado.getApellidoPaterno(), eAfiliado.getApellidoMaterno(),
                eAfiliado.getDireccion(), eAfiliado.getEstadoCivil(), eAfiliado.getFechaInscripcion(), eAfiliado.isActivo()};
            model.addRow(camposAfiliado);
        }

        return model;
    }

    public void registrarNuevo(EntidadAfiliado eAfiliado) throws Exception {
        if (validarDatosEntidad(eAfiliado)) {
            gestorAfiliado.insertar(eAfiliado);
            habilitarAfiliado(eAfiliado.getId());
        } else {
            throw new Exception("La entidad tiene datos errorneos...");
        }
    }

    public void actualizar(String idAfiliado,EntidadAfiliado entidadAfiliado) throws Exception {
        gestorAfiliado.actualizar(idAfiliado, entidadAfiliado);
    }
    
    private boolean validarDatosEntidad(EntidadAfiliado eAfiliado) {
        if (eAfiliado.getId() == null) {
            return false;
        }
        if (eAfiliado.getCi() == 0) {
            return false;
        }
        if (eAfiliado.getNombres() == null) {
            return false;
        }
        //if (eAfiliado.getApellidoPaterno() == null) return false;
        if (eAfiliado.getApellidoMaterno() == null) {
            return false;
        }
        if (eAfiliado.getDireccion() == null) {
            return false;
        }
        if (eAfiliado.getEstadoCivil() == null) {
            return false;
        }
        return true;
    }

    private boolean esLetra(char caracter) {
        if (((caracter >= 'A') && (caracter <= 'Z')) || ((caracter >= 'a') && (caracter <= 'z'))) {
            return true;
        } else {
            return false;
        }
    }

    private boolean esNumero(char caracter) {
        if ((caracter >= '0') && (caracter <= '9')) {
            return true;
        } else {
            return false;
        }
    }

    public String generarCodigo(String apellido) throws Exception {
        String l = ""+apellido.charAt(0);
        ArrayList<Object> lista = gestorAfiliado.listarCodigosPorInicial(l);
        return "" + apellido.charAt(0) + (lista.size() + 1);
    }
}
